/*
 * @Author: 赵东选 1807248216@qq.com
 * @Date: 2024-10-22 19:04:46
 * @LastEditors: 赵东选 1807248216@qq.com
 * @LastEditTime: 2024-10-23 18:20:09
 * @FilePath: /9_int/bsp/int/bsp_int.c
 * @Description:
 *
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
 */
#include "bsp_inc.h"

static unsigned int irqNesting;

/* 中断服务函数表 */
static sys_irq_handler_t irqTable[NUMBER_OF_INT_VECTORS];

/* 初始化中断处理函数表*/
void system_irqtable_init(void)
{
    unsigned int i = 0;

    irqNesting = 0;

    for (i = 0; i < NUMBER_OF_INT_VECTORS; i++)
    {
        irqTable[i].irqHandler = default_irqhandler;
        irqTable[i].userParam = NULL;
    }
}

/*
 * @description			: 给指定的中断号注册中断服务函数
 * @param - irq			: 要注册的中断号
 * @param - handler		: 要注册的中断处理函数
 * @param - usrParam	: 中断服务处理函数参数
 * @return 				: 无
 */
void system_register_irqhandler(IRQn_Type irq, system_irq_handler_t handler, void *userParam)
{
    irqTable[irq].irqHandler = handler;
    irqTable[irq].userParam = userParam;
}

/*
 * @description			: C语言中断服务函数，irq汇编中断服务函数会
                          调用此函数，此函数通过在中断服务列表中查
                          找指定中断号所对应的中断处理函数并执行。
 * @param - giccIar		: 中断号
 * @return 				: 无
 */
void system_irqhandler(unsigned int giccIar)
{
    /* 获取中断ID*/
    unsigned intNum = giccIar & 0x33ff;

    /* 检查中断ID*/
    if (intNum >= NUMBER_OF_INT_VECTORS)
    {
        return;
    }

    irqNesting++;

    /* 根据传递进来的中断号，在irqTable中调用确定的中断服务函数*/
    irqTable[intNum].irqHandler(intNum, irqTable[intNum].userParam);

    irqNesting--;
}

/*
 * @description	: 中断初始化函数
 * @param		: 无
 * @return 		: 无
 */
void int_init()
{
    GIC_Init();
    system_irqtable_init();
    __set_VBAR(0x87800000);
}

/*
 * @description			: 默认中断服务函数
 * @param - giccIar		: 中断号
 * @param - usrParam	: 中断服务处理函数参数
 * @return 				: 无
 */
void default_irqhandler(unsigned int giccIar, void *userParam)
{
    while (1)
    {
    }
}